/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.uniminuto.edu.videominuto.sessionBeans;

import co.uniminuto.edu.videominuto.entities.Video;
import co.uniminuto.edu.videominuto.util.ParametrosGlobales;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Administrador
 */
@Stateless
public class VideoFacade extends AbstractFacade<Video> implements VideoFacadeLocal {
    @PersistenceContext(unitName = "VideoMinutoEJB")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public VideoFacade() {
        super(Video.class);
    }
    
    
    public boolean notIsEmptyString(String s) {
        if (s != null && !s.isEmpty() && !s.equalsIgnoreCase("0")) {
            return true;
        }
        return false;
    }
    
    
   
    
    public List<Video> getVideos(Hashtable<String, String> datos) {
        List<Video> misVideos = new ArrayList<Video>();
        try {


            /*
             * Este el el String QueryGeneral
             */
            String query = ""
                    + "                         From "
                    + "                            Video v "
                    + "                            {%FILTRO_IDIOMA_CLASES%}                     "
                    + "                            Join Fetch v.clasificacion c "
                    + "                            {%FILTRO_PERSONAS_CLASES%}                                 "
                    + "                            {%FILTRO_TIPO_CLASES%}               "
                    + "                            {%FILTRO_CALIFICACION_CLASES%}"
                    + "                            {%FILTRO_CATEGORIA_CLASES%}                                      "
                    + "                         Where "
                    + "                             c.idClasificacion={%FILTRO_CLASIFICACION%}"    
                    + "                             {%FILTRO_IDIOMA%} "
                    + "                             {%FILTRO_FECHAS%}"
                    + "                             {%FILTRO_DURACION%}                    "
                    + "                             {%FILTRO_TIPO%}"
                    + "                             {%FILTRO_CALIFICACION%} "
                    + "                             {%FILTRO_CATEGORIA%}"
                    + "                             {%FILTRO_PERSONAS%}     "
                    + "                                                          "
                    + "                             ";

           //datos.containsKey(ParametrosGlobales.FILTRO_IDIOMA);
            
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_ROL_PERSONA)) && notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_NOMBRE_PERSONA))){
                
                query = query.replace("{%FILTRO_PERSONAS_CLASES%}", "Join Fetch v.regPersonases reg");
                query = query.replace("{%FILTRO_PERSONAS%}", "And reg.persona.nomPersona like :nombrePersona And reg.tipoPersona.idTipoPersona=:tipoPersona");
                
                
            }
            else{
                
                query = query.replace("{%FILTRO_PERSONAS_CLASES%}", "");
                query = query.replace("{%FILTRO_PERSONAS%}", "");
                
            
            }
            
            /**
             * Si llega idioma
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_IDIOMA)) && notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_TIPO_IDIOMA))) {
                
                if(datos.get(ParametrosGlobales.FILTRO_TIPO_IDIOMA).equals("1")){
                  
                    query = query.replace("{%FILTRO_IDIOMA_CLASES%}", " Join Fetch v.idioma i");
                    //Join Fetch v.idioma i
                }
                else if(datos.get(ParametrosGlobales.FILTRO_TIPO_IDIOMA).equals("2")){
                    
                    query = query.replace("{%FILTRO_IDIOMA_CLASES%}", " Join Fetch v.idiomas i");
                }
                else if(datos.get(ParametrosGlobales.FILTRO_TIPO_IDIOMA).equals("3")){
                    query = query.replace("{%FILTRO_IDIOMA_CLASES%}", " Join Fetch v.idiomas_1 i");
                }
                
                query = query.replace("{%FILTRO_IDIOMA%}", "i.idIdioma=:idioma");
                
            } else {
                
                 query = query.replace("{%FILTRO_IDIOMA_CLASES%}", "");
                query = query.replace("{%FILTRO_IDIOMA%}", "");
            }
            
            
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CATEGORIA))){
                 query = query.replace("{%FILTRO_CATEGORIA_CLASES%}", " Join Fetch v.categorias cat ");
                 query = query.replace("{%FILTRO_CATEGORIA%}", " And cat.idCategoria in (:categorias)");
            }
            else{
                 query = query.replace("{%FILTRO_CATEGORIA_CLASES%}", "");
                 query = query.replace("{%FILTRO_CATEGORIA%}", "");
                
            }
            
            
            /*
             * Si llega calificación
             */
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CALIFICACION)) &&
               notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_INI)) &&
               notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_FIN))     
                    ){
                 query = query.replace("{%FILTRO_CALIFICACION_CLASES%}", " Join Fetch v.calificacions cal ");
                 query = query.replace("{%FILTRO_CALIFICACION%}", " And cal.tipoCalificacion.idTipoCalificacion=:calificacion And cal.cantCalificacion>=:califica_ini And cal.cantCalificacion<=:califica_fin ");
            }
            else{
                 query = query.replace("{%FILTRO_CALIFICACION_CLASES%}", "");
                 query = query.replace("{%FILTRO_CALIFICACION%}", "");
            
            }
            
            /**
             * Si llega duración del video
             */
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_INI)) &&
                    notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_FIN))){
                    query = query.replace("{%FILTRO_DURACION%}", "And v.duraVideo>=:duracion_ini And v.duraVideo<=:duracion_fin");
           
            }
            else{
                query = query.replace("{%FILTRO_DURACION%}", "");
            }
            
            /**
             * Si llega tipo de video a consultar
             */
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_TIPO_VIDEO))){
                
                if(datos.get(ParametrosGlobales.FILTRO_TIPO_VIDEO).equals("1")){
                    
                    query = query.replace("{%FILTRO_TIPO%}", "And p.idPelicula is not null");
                    query = query.replace("{%FILTRO_TIPO_CLASES%}", " Join Fetch v.peliculas p ");
                    
                }
                else if(datos.get(ParametrosGlobales.FILTRO_TIPO_VIDEO).equals("2")){
                    query = query.replace("{%FILTRO_TIPO%}", "And s.idSerie is not null");
                    query = query.replace("{%FILTRO_TIPO_CLASES%}", " Join Fetch v.series s");
                }
                else if(datos.get(ParametrosGlobales.FILTRO_TIPO_VIDEO).equals("3")){
                    query = query.replace("{%FILTRO_TIPO%}", "And col.idColeccion is not null");
                    query = query.replace("{%FILTRO_TIPO_CLASES%}", " Join Fetch v.coleccions col");
                }
                else if(datos.get(ParametrosGlobales.FILTRO_TIPO_VIDEO).equals("4")){
                    query = query.replace("{%FILTRO_TIPO%}", "");
                    query = query.replace("{%FILTRO_TIPO_CLASES%}", "");
                    //query = query.replace("{%FILTRO_TIPO%}", "And col.idColeccion is null And s.idSerie is null And p.idPelicula is null");                    
                }
                else{
                  query = query.replace("{%FILTRO_TIPO%}", "");
                  query = query.replace("{%FILTRO_TIPO_CLASES%}", "");
                }
            }
            else{
                  query = query.replace("{%FILTRO_TIPO%}", "");
                  query = query.replace("{%FILTRO_TIPO_CLASES%}", "");
            }
            
            
            /**
             * Si llega clasificación
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CLASIFICACION))) {
                query = query.replace("{%FILTRO_CLASIFICACION%}", ":clasificacion");
            } else {
                query = query.replace("{%FILTRO_CLASIFICACION%}", "c.idClasificacion");
            }

            
            /**
             * Si llegan fechas de producción
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_FECHA_INI_PRODUCCION)) && notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_FECHA_FIN_PRODUCCION))) {
                query = query.replace("{%FILTRO_FECHAS%}", "And v.fechaProduccion >=:fecha_ini AND v.fechaProduccion<=:fecha_fin ");
            } else {
                query = query.replace("{%FILTRO_FECHAS%}", "");
            }

            Query q =getEntityManager().createQuery(query);
            
            
            /**
             * Parametro para idioma
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_IDIOMA))) {
                q.setParameter("idioma", datos.get(ParametrosGlobales.FILTRO_IDIOMA));
            }
            
            
           if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_ROL_PERSONA)) && notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_NOMBRE_PERSONA))){
            
                  q.setParameter("nombrePersona", "%"+datos.get(ParametrosGlobales.FILTRO_NOMBRE_PERSONA)+"%");
                  q.setParameter("tipoPersona", datos.get(ParametrosGlobales.FILTRO_ROL_PERSONA));
  
           }

            
            
            /**
             * Parametros de la calificacion
             */
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CALIFICACION)) &&
               notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_INI)) &&
               notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_FIN))     
                    ){
                
                q.setParameter("calificacion", datos.get(ParametrosGlobales.FILTRO_CALIFICACION));
                q.setParameter("califica_ini", datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_INI));
                q.setParameter("califica_fin", datos.get(ParametrosGlobales.FILTRO_RANGO_CAL_FIN));
                
            }
            
            
            /**
             * Parametro para clasificación
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CLASIFICACION))) {
                q.setParameter("clasificacion", datos.get(ParametrosGlobales.FILTRO_CLASIFICACION));
            }
            
             if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_CATEGORIA))){
                 q.setParameter("categorias", datos.get(ParametrosGlobales.FILTRO_CATEGORIA));
                 
            }
            
            /**
             * Parametros de fechas de producción
             */
            if (notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_FECHA_INI_PRODUCCION)) && notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_FECHA_FIN_PRODUCCION))) {
                q.setParameter("fecha_ini", datos.get(ParametrosGlobales.FILTRO_FECHA_INI_PRODUCCION));
                q.setParameter("fecha_fin", datos.get(ParametrosGlobales.FILTRO_FECHA_FIN_PRODUCCION));
            }
            
            /**
             * Parametros derango de duración
             */
            if(notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_INI)) &&
                    notIsEmptyString(datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_FIN))){
                q.setParameter("duracion_ini", datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_INI));
                q.setParameter("duracion_fin", datos.get(ParametrosGlobales.FILTRO_RANGO_DURACION_FIN));
            }
            

            misVideos = (List<Video>) q.getResultList();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return misVideos;
    }
    
}
